// https://blog.csdn.net/rxbook/article/details/130646031

package main

import "fmt"

type users struct {
	age int
}

// 使用 users 类型,传递的是副本,不会影响原数据
func (u users) setAge1(age int) {
	u.age = age
}

// 使用 *users 类型,传递的是原数据的地址,会影响原数据
func (u *users) setAge2(age int) {
	u.age = age
}

func main() {
	// 1.通过 users 调用
	var u1 users
	fmt.Println(u1.age) // 0
	u1.setAge1(18)
	fmt.Println(u1.age) // 0
	u1.setAge2(18)      //Go 判断 u1 的类型为 users，与方法 setAge2() 的 receiver 参数类型 *users 不一致，此时会自动将 u1.setAge2()转换为(&u1).setAge2()
	// (&u1).setAge2(18)   //与上面一行等价
	fmt.Println(u1.age) // 18
	println()

	// 2.通过 *users 调用
	var u2 = &users{}
	fmt.Println(u2.age) // 0
	u2.setAge1(25)      // Go 判断 u2 的类型为 *users，与方法 setAge1() 的 receiver 参数类型 users 不一致，就会自动将 u2.setAge1() 转换为 (*u2).setAge1()
	// (*u2).setAge1(25)   //与上面一行等价
	fmt.Println(u2.age) // 0
	u2.setAge2(25)
	fmt.Println(u2.age) // 25
}
